home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
UNIXLIB37B
/
!UnixLib37
/
src
/
signal
/
c
/
sigaltstk
< prev
next >
Wrap
Text File
|
1996-11-09
|
2KB
|
63 lines
/****************************************************************************
*
* $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigaltstk,v $
* $Date: 1996/10/30 22:04:51 $
* $Revision: 1.1 $
* $State: Rel $
* $Author: unixlib $
*
* $Log: sigaltstk,v $
* Revision 1.1 1996/10/30 22:04:51 unixlib
* Initial revision
*
***************************************************************************/
static const char rcs_id[] = "$Id: sigaltstk,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
/* Written by Nick Burrett, 27 August 1996. */
#include <signal.h>
#include <errno.h>
#include <unixlib/sigstate.h>
#include <sys/unix.h>
/* Specifies an alternate stack for use during signal handling.
When a signal is received by the process and its action
indicates that the signal stack is used, the system arranges
a switch to the currently installed signal stack while the
handler for that signal is executed. */
int
sigaltstack (const struct sigaltstack *stack,
struct sigaltstack *oldstack)
{
struct unixlib_sigstate *ss = &__u->sigstate;
if (stack->ss_size < MINSIGSTKSZ)
{
/* The size of the alternate stack was too small. */
errno = ENOMEM;
return -1;
}
if (ss->signalstack.ss_flags & SA_ONSTACK)
{
/* Trying to disable a stack that is currently in use. */
errno = EINVAL;
return -1;
}
if (oldstack != NULL)
{
oldstack->ss_sp = ss->signalstack.ss_sp;
oldstack->ss_size = ss->signalstack.ss_size;
oldstack->ss_flags = ss->signalstack.ss_flags;
}
if (stack != NULL)
{
ss->signalstack.ss_sp = stack->ss_sp;
ss->signalstack.ss_size = stack->ss_size;
ss->signalstack.ss_flags = stack->ss_flags;
}
return 0;
}